shell学习笔记 1 - 编程基础语法

变量与函数

shell语言的赋值就和python语言是弱类型语言,对于简单数据类型,即数值与字符串,直接采用下列方法即可。而且,在赋值时不要在=两边加空格,否则会编译错误

1
2
a=1
b='hello world'

变量引用

  1. "var"双引号:弱引用,echo "${var}"输出这个变量具体值
  2. 'var'单引号:强引用,echo '${var}'输出”${var}”字符串
  3. `` 反引号等同于$()

变量作用域

shell中的变量定义默认的作用域是全局,如果想实现其他语言的闭包,则需要加装local字段。

P.S. 此处的全局变量范围是当前进程

1
2
3
4
a=1
function fun1() {
local a=2
}

这样,在调用func1()时,其内部a的值就可以变成2。

变量运算

整数

假定先定义好a=1;b=2

  1. expr:c="expr $a+$b"
  2. $(()):c=$((a+b))
  3. $[]:c=$[a+b]
  4. let:let c=a+b

浮点数

  1. echo "scale=2;6/4"|bc
  2. echo "print 6/4"|python

这给人感觉貌似shell并不怎么支持浮点数运算,得交给其他程序去实现,可能跟他的业务不怎么偏计算有关吧。。

条件控制

if语句

1
2
3
4
5
6
7
8
9
if test "2>3" 
then
# do something
elif ["3>4"]
then
# do something
else
# do something
fi

其中test "2>3"也可以写作["2>3"],其他常见的布尔运算符和其他语言一致:与&&,或||,非!

switch语句

1
2
3
4
5
6
case expression in
pattern1 )
statement;;
pattern2 )
statement;;
esac

这里pattern指的是类似于-d -f这种匹配模式

对于字符串的判断,有很多和正则表达式相似的表达式,例如:

1
2
-n str1   #str1为非 null
-z str1 #str1为 null

之后,也会单独讲一讲这种判断规则

循环

for循环

1
2
3
4
for i in [list like]
do
# do something
done

while循环

1
2
3
4
while ["3>4"]
do
# do something
done

until循环

1
2
3
4
until ["3>4"]
do
# do something
done

函数

函数定义

1
2
3
4
5
6
7
8
9
10
11
12
13
function func1 () {
echo "Hello World"
}

func2 () {
# do something
if [ $1 == 1]
then
return 1
else
echo "not 1"
fi
}

作用域:在函数内部定义local变量名如果和外部一样的话,return的时候不会影响外部,即返回值使用函数内的值,但函数使用完就进行销毁,不影响外面同名值。

函数参数

shell不用特意在函数定义时写形参,在函数体内部可以直接通过$1, $2这种形式来指定参数

函数调用

在命令行中调用写好的函数时,直接把函数名打上,如果函数需要参数,则将参数以空格形式隔开

1
2
3
4
# 调用无参数函数
func1
# 调用有参数函数
func2 1 2

关于return结果的调用,

  1. 使用$?;此方法只能返回0-255的整数,且需要先采取上面方式调用,然后去取值。(感觉好不智能,有点汇编的感觉)

  2. 直接写成result=$(func2 1),这个方法对于返回值没有过多的限定,以后用这个比较好。